文件分类：
	文本文件:记录的是字符串的二进制
	二进制文件：直接把数据补码记录到文件中
    磁盘只能存储二进制数据。
    文件文件中存储的是ASCII码的二进制，先把数据转换成字符中，再写入到文件中，可以直接被文本编辑器打开。
    二进制文件中存储的数据的二进制，直接把数据的二进制存储到文件中，无法直接通过文件编辑器查看。
    
文件I/O：
    FILE *fopen(const char *path, const char *mode);
    功能：打开或创建文件
    path：文件的路径（可以是相对路径，也可以是绝对路径）
    mode：文件的打开方式
        "w" 以只写权限打开文件，如果文件不存在则创建，存在则清空文件的内容。
        "w+" 在"w"的基础上增加读取权限。
        "r" 以只读权限打开文件，如果文件不存在则打开失败。
        "r+" 在"r"的基础上增加写取权限
        "a" 以只写权限打开文件，如果文件不存在则创建，存在保留原内存，新写入的数据会追加到文件末尾。
        "a+" 在"w"的基础上增加读取权限。
        "b" 不能单独使用，而是与"wra"配合使用，表示打开的是二进制文件，对于Linux系统而说没什么用。
        在Windows系统下：
            "b"表示操作的是二进制文件 \n 直接写入 \n。
            不加"b"表示操作的是文本文件，\n 会被写入 \n\r。
    返回值：返回的是一个结构体指针，不需要操作结构的成员，只需要反它当作一个令牌即可，用来区别所操作的文件，如果文件打开失败返回值为NULL。
    
    int fprintf(FILE *stream, const char *format,...);
    功能：以文本形式写入数据
    stream：文件指针，fopen函数的返回值
    format：占位符
    ...：变量名
    返回值：成功写入字节的个数
    
    int fscanf(FILE *stream, const char *format, ...);
    功能：从文件中以文本形式读取数据到变量
    stream：文件指针，fopen函数的返回值
    format：占位符
    ...：变量的地址
    返回值：成功读取到的变量的个数
    
    练习1：设计一个学生结构体，定义结构变量并初始化，然后把结构变量写入到stu.txt文件中。
    练习2：从stu.txt文件中读取数据到学生结构变量中，并显示结构变量中的内容。
    
    size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
    功能：把数据的二进制写入到文件中
    ptr：要写入的数据的首地址
    size：写入的字节数
    nmemb：写入的次数
    stream：文件指针，fopen的返回值
    返回值：成功写入的次数
    
    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    功能：从文件中以二进制的形式读取数据到内存中
    ptr：读取数据后的存储位置
    size：每次读取的字节数
    nmemb：读取的次数
    stream：文件指针，fopen的返回值
    返回值：成功写入的次数
    
    fread(&stu,1,sizeof(stu),frp);
    
    练习3：设计一个学生结构体，定义结构变量并初始化，然后把结构变量写入到stu.dat文件中。
    练习4：从stu.dat文件中读取数据到学生结构变量中，并显示结构变量中的内容。
    

	
    文件位置指针：每一个打开文件系统都会用一个变量记录文件的读写的位置。
				  使用w、r打开的文件位置指针都在文件的开头，而使用a打开的文件，位置指针都在末尾。
				  位置指针会随着数据的读写而变化。
    
	int fseek(FILE *stream, long offset, int whence);
    功能：设置文件的位置指针,位置指针会设置到 基础位置＋偏移值
    stream：文件指针
    offset：偏移值
    whence：基础位置
        SEEK_SET 文件开头
        SEEK_CUR 当前位置
        SEEK_END 文件末尾
    返回值：调用后的文件位置指针（整数，字节数）。
	
    long ftell(FILE *stream);
    功能：获取文件的位置指针，位置指针当前所在的字节数
    
    void rewind(FILE *stream);
    功能：把文件的位置指针，调整到开头。
    
    
	练习5：实现一个函数，计算文件的大小。
    
    int fclose(FILE *fp);
    功能：关闭文件
    当数据写入后并没有立即同步到磁盘中，而存储在缓冲区中，只有满足一些条件时才会从缓冲区中写入到磁盘中。
    1、从输出调整到输入。
    2、缓冲区满4k
    3、文件关闭
    4、程序结束
    5、手动刷新 int fflush(FILE *stream);
    
    默认打开的文件指针：
        stdin 标准输入
        stdout 标准输出
        stderr 标准错误
        
    结构体序列化和反序列化：
        体序列化：结构变量转换成字符串
        int sprintf(char *str, const char *format, ...);
        功能：把一些变量按照格式合并成一个字符串
        format：占位符
        ...：变量名
        返回值：合并后的字符串长度
        为什么要进行序列化：
            1、为了方便数据库操作
            2、方便网络传输
            3、文件读写
        
        反序列化：字符串转换成结构体
        int sscanf(const char *str, const char *format, ...)
        功能：从字符串中读取数据到变量
        str：待读取数据的字符串
        format：占位符
        ...：变量地址
        返回值：成功读取的变量数
        
main函数的参数：
    main的参数可以让程序从命令行执行时附加一些字符串，如：执行系统命令时附加的参数就是以参数使用实现的。
    ls -l
    touch filename
    int main(int agrc,char* argv[])
    {
        agrc：字符串的数量
        argv：存储字符串的指针数组
    }
    
    int access(const char *pathname, int mode);
    功能：检查文件的权限
    pathname：文件路径
    mode：
        F_OK 检查文件是否存在
        R_OK 检查文件是否有读权限
        W_OK 检查文件是否有写权限
        X_OK 检查文件是否有执行权限
    返回值：成功返回0，失败返回-1
        
    练习6：实现带覆盖检查功能cp命令。
        1、检查命令格式
        2、检查源文件是否存在，不存在则结束
        3、检查目标文件是否存储
            如果存在询问是否覆盖
            不存在则读取源文件的内存写入到目标文件中
    
    
    
    
    

